package online.heycm.platform.common.tools.file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件操作工具
 *
 * @author heycm
 * @since 2023/12/21 20:31
 */
public class FileUtil {

    private FileUtil() {}

    /**
     * 获取指定目录下所有文件
     *
     * @param directory 目录
     * @return 文件集
     */
    public static List<File> traverseDirectory(File directory) {
        List<File> all = new ArrayList<>();
        // 检查目录是否存在
        if (directory != null && directory.exists()) {
            if (directory.isDirectory()) {
                // 获取目录中的所有文件和子目录
                File[] files = directory.listFiles();
                if (files != null) {
                    // 遍历文件和子目录
                    for (File file : files) {
                        if (file.isDirectory()) {
                            // 如果是目录，则递归遍历子目录
                            all.addAll(traverseDirectory(file));
                        } else {
                            // 如果是文件，则加入集合
                            all.add(file);
                        }
                    }
                }
            } else {
                all.add(directory);
            }
        }
        return all;
    }

    /**
     * 获取指定目录下所有文件
     *
     * @param directory 目录
     * @return 文件集
     */
    public static List<File> traverseDirectory(String directory) {
        return traverseDirectory(new File(directory));
    }

    /**
     * 删除指定目录或文件
     *
     * @param file 目录或文件
     */
    public static void delete(File file) {
        // 检查目录是否存在
        if (file != null && file.exists()) {
            if (file.isDirectory()) {
                // 获取目录中的所有文件和子目录
                File[] children = file.listFiles();
                if (children != null) {
                    // 遍历文件和子目录
                    for (File child : children) {
                        if (child.isDirectory()) {
                            // 如果是子目录，则递归删除子目录
                            delete(child);
                        } else {
                            // 如果是文件，则直接删除文件
                            child.delete();
                        }
                    }
                }
            }
            // 删除空目录
            file.delete();
        }
    }

    /**
     * 删除指定目录或文件
     *
     * @param file 目录或文件
     */
    public static void delete(String file) {
        delete(new File(file));
    }

}
